home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / TSR.SWG / 0031_Trapping Control C-Break-Alt-Del.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  3KB  |  84 lines

  1. {
  2. > I am looking for some source code that will trap Control-Alt-Del,
  3. > Control-C, and Control-Break, prefered if it can be loaded into
  4. > the Config.sys, but autoexec.bat would work also.
  5.  
  6.   The compiled code can be loaded from the DOS prompt or
  7.   from any batch. To avoid the message just redirect output
  8.   to the nul device:
  9.  
  10.      breaknot > nul
  11. }
  12.  
  13. {$F+}  {Far procedures...}
  14. {$M 2048,0,0}
  15.  
  16. Program BreakNot;
  17. {---------------------------------------------------------------}
  18. { This TSR code intercepts hardware interrupt $9 and checks for }
  19. { Ctrl-C, Ctrl-Break and Ctrl-Alt-Del. If none of these key     }
  20. { combinations has been pressed the preceeding Int 9 is chained,}
  21. { otherwise, the keyboard is reset without calling the previous }
  22. { keyboard vector. Interrupt vectors $1B and $23 are not        }
  23. { redirected. Rebooting is the only way to unload the TSR and   }
  24. { re-enable breaks.                                             }
  25. { Note: usual disclaimers apply: use at own risk, etc...        }
  26. { - Copyright (c) 1994 Jose Campione 1:163/513.3 -              }
  27. {---------------------------------------------------------------}
  28.  
  29. Uses DOS;
  30.  
  31. Var
  32.   KbdStat: byte absolute $0000:$0417;
  33.   KbdPort: byte;
  34.   OldKBD : pointer;
  35.  
  36. procedure JmpOldISR(OldISR: pointer);
  37. { ------------------------------------------------}
  38. { Standard Inline code to Jump from an ISR to the }
  39. { vector being passed. Origin: an old Critical    }
  40. { Interrupt handler. Note: Merely rewriting this  }
  41. { inline code as an Assembler procedure will not  }
  42. { work -Jose-                                     }
  43. {-------------------------------------------------}
  44.   inline($5B/$58/$87/$5E/$0E/$87/$46/$10/$89/
  45.          $EC/$5D/$07/$1F/$5F/$5E/$5A/$59/$CB);
  46.  
  47. procedure ResetKbd; assembler;
  48. {---------------------------------------}
  49. { Standard code to reset the keyboard   }
  50. { Origin: N. Rubenking's book on TP 6.0 }
  51. {---------------------------------------}
  52. asm
  53.   in     AL,$61     {read keyboard controller}
  54.   mov    AH, AL
  55.   or     AL,$80     {set the "reset bit"}
  56.   out   $61, AL     {send it out}
  57.   xchg   AH, AL     {get original value}
  58.   out   $61, AL     {send it out}
  59.   cli               {disable interrupts}
  60.   mov    AL,$20     {EOI, end-of-interrupt signal}
  61.   out   $20, AL     {send EOI to programmable interrupt controller}
  62.   sti               {enable interrupts}
  63. end;
  64.  
  65. procedure Key_ISR; interrupt;
  66. begin
  67.   KbdPort:= 0;
  68.   KbdPort:= port[$60];
  69.   if (((KbdStat and  4) =  4) and (KbdPort in [46,70])) or
  70.      (((KbdStat and 12) = 12) and (KbdPort = 83)) then
  71.     ResetKbd             {reset Kbd w/o chaining int 9}
  72.   else
  73.   JmpOldISR( OldKBD );   {jump to Old Keyboard handler }
  74. end;
  75.  
  76. Begin
  77.  writeln(' BreakNot! Copyright (c) 1994, J.Campione');
  78.  writeln(' Ctrl-C, Ctrl-Break and Ctrl-Alt-Del are now disabled');
  79.  writeln(' To re-enable breaks, reset or restart the computer');
  80.  GetIntVec(9,OldKBD);
  81.  SetIntVec(9,@Key_ISR);
  82.  Keep(0);
  83. End.
  84.